package com.caocaog.market.finance.pay.alipay;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayFundTransUniTransferModel;
import com.alipay.api.domain.Participant;
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
import com.alipay.service.schema.util.StringUtil;
import com.caocaog.market.finance.pay.vo.AlipayTransferBean;
import org.jeecg.common.api.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 支付宝 单笔转账工具类
 *
 * @author: chenjie
 * @date: 2022年12月09日 15:15
 */
public class AlipayFundTransUniTransfer {

    @Autowired
    private FinancePayBean alipayben;

    public Result<?> alipayTransfer(AlipayTransferBean bean) throws AlipayApiException {
        //判空
        if (StringUtil.isEmpty(bean.getAlipayAccount())) {
            return Result.error("提现账户为空");
        }
        if (StringUtil.isEmpty(bean.getTransAmount())) {
            return Result.error("提现金额为空");
        }
        if (StringUtil.isEmpty(bean.getOutBizNo())) {//默认：yyyyMMddHHmmss+支付宝账号
            bean.setOutBizNo(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + bean.getAlipayAccount());
        }

        CertAlipayRequest alipayConfig = new CertAlipayRequest();
        alipayConfig.setPrivateKey(alipayben.getPrivateKey());//请填写您的应用私钥，例如：MIIEvQIBADANB
        alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
        alipayConfig.setAppId(alipayben.getAppId());//请填写您的AppId，例如：2019091767145019
        alipayConfig.setCharset("UTF8");
        alipayConfig.setSignType("RSA2");
        alipayConfig.setEncryptor("");
        alipayConfig.setFormat("json");
        alipayConfig.setCertPath(alipayben.getAppCertPath());//请填写您的应用公钥证书文件路径，例如：/foo/appCertPublicKey_2019051064521003.crt
        alipayConfig.setAlipayPublicCertPath(alipayben.getAliPayCertPath());//请填写您的支付宝公钥证书文件路径，例如：/foo/alipayCertPublicKey_RSA2.crt
        alipayConfig.setRootCertPath(alipayben.getAliPayRootCertPath());//请填写您的支付宝根证书文件路径，例如：/foo/alipayRootCert.crt

        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
        AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
        model.setOutBizNo(bean.getOutBizNo());//必填，商家侧唯一订单号，由商家自定义。对于不同转账请求，商家需保证该订单号在自身系统唯一。例如：201806300001
        model.setRemark(StringUtil.isEmpty(bean.getRemark()) ? "用户提现" : bean.getRemark());//业务备注，单笔转账金额达到50000元时必填，不可包含敏感词。 例如：201905代发
        model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");// 扩展参数  例如："{\"payer_show_name_use_alias\":\"true\"}"展示商家的支付宝别名
        model.setBizScene("DIRECT_TRANSFER");//必填 业务场景。单笔无密转账固定为 DIRECT_TRANSFER。

        Participant payeeInfo = new Participant();//必填 收款方信息
        //参与方的标识 ID。
        //当 identity_type=ALIPAY_USER_ID 时，填写支付宝用户 UID。示例值：2088123412341234。
        //当 identity_type=ALIPAY_LOGON_ID 时，填写支付宝登录号。示例值：186xxxxxxxx。
        payeeInfo.setIdentity(bean.getAlipayAccount());
        payeeInfo.setIdentityType("ALIPAY_LOGON_ID");//参与方的标识类型，目前支持如下枚举：ALIPAY_USER_ID  ALIPAY_LOGON_ID
        payeeInfo.setName(bean.getAlipayName());//参与方真实姓名。如果非空，将校验收款支付宝账号姓名一致性。
        model.setPayeeInfo(payeeInfo);
        model.setTransAmount(bean.getTransAmount());//必填 订单总金额，单位为元，不支持千位分隔符，精确到小数点后两位，取值范围[0.1,100000000]。
        model.setProductCode("TRANS_ACCOUNT_NO_PWD");//必填 销售产品码。单笔无密转账固定为 TRANS_ACCOUNT_NO_PWD。
        model.setOrderTitle(StringUtil.isEmpty(bean.getOrderTitle()) ? "用户提现" : bean.getOrderTitle());//必填 转账业务的标题，用于在支付宝用户的账单里显示。
        request.setBizModel(model);
        AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
        System.out.println(response.getBody());
        if (!response.isSuccess()) {
            System.out.println("调用失败");
            return Result.error(response.toString());
        }
        System.out.println("调用成功");
        return Result.OK(response);
    }


}
